package com.mcp.server.handler;



import com.mcp.server.model.McpError;
import com.mcp.server.model.McpResponse;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 资源处理器
 * 负责管理MCP协议中的资源(Resources)操作
 * 资源特点：只读、结构化/非结构化数据
 */
public class ResourceHandler {
    // 内存资源存储（模拟）
    private final Map<String, Object> memoryResources = new ConcurrentHashMap<>();
    
    // 支持的资源类型
    private enum ResourceType {
        MEMORY,  // 内存资源
        FILE,    // 文件资源
        HTTP     // HTTP资源
    }

    public ResourceHandler() {
        // 初始化一些示例资源
        memoryResources.put("sample_config", Map.of(
            "timeout", 5000,
            "retries", 3,
            "enabled", true
        ));
    }

    /**
     * 获取资源
     * @param resourceId 资源标识符
     * @param params 可选参数
     */
    public Object getResource(String resourceId, Map<String, Object> params) throws Exception {
        // 解析资源类型（格式：type:id）
        String[] parts = resourceId.split(":", 2);
        ResourceType type = ResourceType.valueOf(parts[0].toUpperCase());
        String id = parts.length > 1 ? parts[1] : "";
        
        switch (type) {
            case MEMORY:
                return handleMemoryResource(id);
            case FILE:
                return handleFileResource(id, params);
            case HTTP:
                return handleHttpResource(id, params);
            default:
                throw new IllegalArgumentException("未知资源类型: " + type);
        }
    }

    /**
     * 处理内存资源
     */
    private Object handleMemoryResource(String resourceId) {
        if (!memoryResources.containsKey(resourceId)) {
            throw new IllegalArgumentException("内存资源不存在: " + resourceId);
        }
        return memoryResources.get(resourceId);
    }

    /**
     * 处理文件资源
     */
    private Object handleFileResource(String filePath, Map<String, Object> params) throws IOException {
        Path path = Paths.get(filePath);
        
        // 检查文件是否存在
        if (!Files.exists(path)) {
            throw new IOException("文件不存在: " + filePath);
        }
        
        // 根据参数决定读取方式
        boolean asText = params == null || !params.containsKey("binary") || !(Boolean) params.get("binary");
        
        if (asText) {
            return Files.readString(path);
        } else {
            return Files.readAllBytes(path);
        }
    }

    /**
     * 处理HTTP资源（简化版）
     */
    private Object handleHttpResource(String url, Map<String, Object> params) throws Exception {
        // 这里只是示例，实际应该使用HttpClient
        // 模拟HTTP请求
        if (url.contains("example.com/api")) {
            return Map.of(
                "status", "success",
                "data", "模拟的HTTP响应数据"
            );
        }
        throw new IOException("无法访问URL: " + url);
    }

    /**
     * 列出所有可用资源
     */
    public Map<String, String> listResources() {
        Map<String, String> resources = new HashMap<>();
        
        // 内存资源
        memoryResources.keySet().forEach(key -> 
            resources.put("memory:" + key, "内存资源"));
        
        // 添加示例文件资源
        resources.put("file:/tmp/sample.txt", "示例文本文件");
        
        // 添加示例HTTP资源
        resources.put("http:example.com/api", "示例API");
        
        return resources;
    }

    /**
     * 统一错误处理
     */
    public McpResponse createErrorResponse(Object requestId, Exception e) {
        return McpResponse.error(requestId, 
            new McpError(McpError.INTERNAL_ERROR, "资源操作失败: " + e.getMessage(), null));
    }
}